/**
 * 对象数组分组
 * @param  {Array} 对象数组, 必传
 * @param  {String | Function} 分组的key / 返回分组key的回调, 必传
 * @return {Object} 分组后的对象
*/

function groupBy(arr, iterate) {
  const type = Object.prototype.toString.call(iterate).slice(8, -1).toLowerCase()
  const iterateTypes = ['number', 'string', 'boolean', 'null', 'undefined', 'function']
  if (!Array.isArray(arr) || !iterateTypes.includes(type)) 
    return {}

  return arr.reduce((result, item, index) => {
    const key = type === 'function' ? iterate(item, index, arr) : item[iterate]
    result[key] = result[key] ? [...result[key], item] : [item]
    return result
  }, {})
}


// // 测试
//  const arr = [
//   { name: '张老三', age: 18, gender: 'male' }, 
//   { name: '李老四', age: 18, gender: 'male' },
//   { name: '李丽',  age: 20, gender: 'female' }
//  ]
//  groupBy(arr, 'age');
// //  {
// //   '18': [{ name: "张老三", age: 18, gender: "male" }, { name: "李老四", age: 18, gender: "male" }],
// //   '20': [{ name: "李丽", age: 20, gender: "female" }]
// //  }
//  groupBy(arr, ({age, gender}) => `${age}-${gender}`);
// //  {
// //   '18-male': [{ name: "张老三", age: 18, gender: "male" }, { name: "李老四", age: 18, gender: "male" }],
// //   '20-female': [{ name: "李丽", age: 20, gender: "female" }]
// //  }
